package com.example.springcloud_01serviceribbon.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @description:
 * @author: guoc
 * @createDate: 2020/6/28 16:08
 */
@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    /**
     * 直接用的程序名替代了具体的url地址，
     * 在ribbon中它会根据服务名来选择具体的服务实例，
     * 根据服务实例在请求的时候会用具体的url替换掉服务名
     *
     * 针对@LoadBalanced下的RestTemplate的使用，总结如下细节供以参考：
     * 传入的String类型的url必须是绝对路径（http://...），否则抛出异常：java.lang.IllegalArgumentException: URI is not absolute
     * serviceId不区分大小写（http://user/...效果同http://USER/...）
     * serviceId后请不要跟port端口号了~~~
     * ————————————————
     * 版权声明：本文为CSDN博主「YourBatman」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://fangshixiang.blog.csdn.net/article/details/100788040
     *
     * @author guoc
     * @date 2020/6/28 16:24
     */
    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }

    /**
     * 在浏览器上多次访问http://localhost:8764/hi?name=forezp，浏览器交替显示：
     *
     * hi forezp,i am from port:8762
     * hi forezp,i am from port:8763
     *
     * 这说明当我们通过调用restTemplate.getForObject(“http://SERVICE-HI/hi?name=”+name,String.class)方法时，已经做了负载均衡，访问了不同的端口的服务实例。
     * @author guoc
     * @date 2020/6/28 16:29
     */


    /**
     * 熔断方法
     * @return java.lang.String
     * @author guoc
     * @date 2020/7/1 13:26
     */
    public String hiError(String name) {
        return "hi,"+name+",sorry,error 熔断方法!";
    }


}
